//自带的
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
//自带的
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

//自己写的
const UserRouter = require('./routes/admin/UserRouter')
const JWT = require("./util/JWT"); //app.js内一定要引入jwt啊 视频中没写 导致获取接口 提交接口都提示JWT is not defined，ReferenceError: JWT is not defined    at F:\NODEVUE\kerwin_project\server\app.js:52:19

//自带的
var app = express();
//自带的
// view engine setup//自带的
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
//自带的
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//自带的
app.use('/', indexRouter);
app.use('/users', usersRouter);
//自带的
/*
自己写的
/adminapi/* - 后台管理系统
/webapi/* -企业官网api
这里只注册路由 配置路由写到routes文件夹内
*/

//挂载路由之前 统一获取前端来的token 进行验证 
//放在app.use(UserRouter)之前 用中间件
//定义一个应用级中间件
//req（请求对象）、res（响应对象）和 next（下一个中间件或路由处理程序的引用）
app.use((req, res, next)=> {
  //如果token有效 next(),如果token过期 返回401错误
  //这里不仅要添加上登陆的接口 还要添加上头像上传的接口 不然在UserController.js内打印不出req.body, req.file ，且点击头像更新按钮后直接跳转到了登陆页面 上传头像也报错500 视频上这里没讲添加头像上传的接口！！
  if(req.url === "/adminapi/user/login" || req.url === "/adminapi/user/upload"){
    next()
    return;
  }
  //取出token值
  const token = req.headers["authorization"].split(" ")[1]
  console.log("后端拦截-取出token了吗88",req.headers)
  //if token存在 且 验证成功(在有效期内)，则再重新生成个token(访问过一次后，这个过期时间就要重新计算啦)
  if(token){
    //用verify验证前端发来的token 是否过期
    var payload = JWT.verify(token)
    //console.log("后端-JWT.verify验证后的token",payload)
    if(payload){
      //重新生成token 返回给前端
      const newToken = JWT.generate({
        _id:payload._id,
        username:payload.username
      }, "1d")//1天过期
      res.header("Authorization", newToken)
      next()
    }else {
      res.status(401).send({
        errCode: "-1",
        errorInfo: "token过期"
      })
    }
    
  }

})

app.use(UserRouter)


// catch 404 and forward to error handler//自带的
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler//自带的
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
//自带的
module.exports = app;
